public class TestDemo {
    static class Person implements Cloneable {
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }

    public static void main(String[] args) {
        Person per = new Person();
        try {
            Person per2 = (Person) per.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }

    public static void func() {
        int[] array = {1, 2, 3, 4};
        System.out.println(array[100]);
    }

    public static int divide(int x, int y) throws ArithmeticException {//throws关键字可以声明异常
        if (y == 0) {
            throw new ArithmeticException("y==0");
        }
        return x / y;
    }

    //抛出异常  throw  一般是用来抛出某个你想抛出的异常(也可以是自定义的异常)
    public static void main4(String[] args) {
        try {
            int ret = divide(20, 0);
            System.out.println(ret);
        } catch (ArithmeticException e) {
            e.printStackTrace();
            System.out.println("异常");
        } finally {
            System.out.println("继续执行！");
        }

    }

    public static void main3(String[] args) {
        /*func();*/
        try {
            func();
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        }
        System.out.println("after try catch");
    }
    //方法的调用是要到栈上开辟内存的，如果本方法中没有合适的处理异常的方式，就会沿着调用栈向上传递


    // func函数中没有处理异常的方式，那么调用这个方法的main函数就必须处理，
    // 如果main函数中没有异常处理，那么就会交给JVM，那么程序必然会异常中断

    public static void main2(String[] args) {
        int[] array = {1, 2, 3, 4};
        System.out.println(array[4]);
        System.out.println("hello");
    }

    public static void main1(String[] args) {
        int[] array = {1, 23, 4, 5};
        try {
            System.out.println(array[4]);
        } catch (NullPointerException e) {
            e.printStackTrace();
            System.out.println("捕获到了空指针异常");
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
            System.out.println("捕获到了数组越界异常");
        } finally {
            System.out.println("finally块的代码肯定会被执行！，" +
                    "所以经常拿来做一些善后工作，比如说关闭资源！");
        }
        System.out.println("hello");
    }
}
